해당 자료는 전북대학교 이영미 교수님 2023고급시계열분석 자료임
############## package
library (forecast) #ses
library (data.table)
library (ggplot2)
library (lmtest) #dwtest
library (TTR) #SMA
library (lubridate)
library (gridExtra)
Registered S3 method overwritten by 'quantmod':
method from
as.zoo.data.frame zoo
Loading required package: zoo
Attaching package: ‘zoo’
The following objects are masked from ‘package:base’:
as.Date, as.Date.numeric
Attaching package: ‘lubridate’
The following objects are masked from ‘package:data.table’:
hour, isoweek, mday, minute, month, quarter, second, wday, week,
yday, year
The following objects are masked from ‘package:base’:
date, intersect, setdiff, union
1
# 데이터 불러오기
z <- scan ("mindex.txt" )
\(S_n^{(1)} = w \sum_{j=0}^{n-1} (1-w)^j Z_{n-j} + (1-w)^n S_0^{(1)}\)
simple_exp_smoothing <- function (z,w,s0){
Sn <- c ()
Sn[1 ] <- w* z[1 ] + (1 - w)* s0
for (k in 2 : length (z)){
Sn[k] <- w * z[k] + (1 - w)* Sn[k-1 ]
}
return (Sn)
}
ses_0.6 <- simple_exp_smoothing (z,0.6 ,15 )
ses_0.2 <- simple_exp_smoothing (z,0.2 ,15 )
ts.plot (ts (z), ses_0.6 , ses_0.2 , col= 1 : 3 , lwd= 2 )
legend ("topright" , legend = c ("z" ,"w=0.6" ,"w=0.3" ), col= 1 : 3 , lty= 1 )
W값이 클수록 원 데이터와 비슷하고, 평활 효과가 작아진다.
W값이 작을수록 원데이터를 천천히 따라가고, 평활 효과가 커진다.
\(\hat Z_{t-1}(1) = S_{t-1}^{(1)}\) 이므로
point <- c (2 ,3 ,99 ,100 )
ses_0.6 [point-1 ]
ses_0.2 [point-1 ]
11.58 11.052 12.6262842848221 10.1505137139288
13.86 13.228 11.4677321254815 10.8741857003852
2
(1)
추세가 있기 때문에 이중지수평활법을 사용한다.
female_smoothing <- HoltWinters (z, gamma = FALSE )
female_smoothing
Holt-Winters exponential smoothing with trend and without seasonal component.
Call:
HoltWinters(x = z, gamma = FALSE)
Smoothing parameters:
alpha: 1
beta : 0.01666631
gamma: FALSE
Coefficients:
[,1]
a 667.000000
b 5.145043
plot (female_smoothing, lwd= 2 )
legend ("topleft" , legend= c ("z" ,expression (alpha == 1 ~ "," ~ beta== 0.02 )), lty= 1 , lwd= 2 )
-
예측오차 분석
head (female_smoothing$ fitted)
A Time Series: 6 × 3
3
230.0000
223
7.000000
4
235.9833
229
6.983334
5
241.9669
235
6.966945
6
233.7175
227
6.717501
7
242.7555
236
6.755542
8
238.5763
232
6.576287
HoltWinters 함수를 사용하는 경우, 이중지수 평활값이 3번째부터 구해진다. 따라서 예측오차 역시 원데이터의 3번째 값부터 구할 수 있다.
resid_female <- z[- (1 : 2 )] - female_smoothing$ fitted[,1 ] #또는
resid_female <- resid (female_smoothing) #같은 방법임
plot.ts (resid_female)
abline (h= 0 , lty= 2 )
예측오차의 경우 0을 중심으로 대칭이고, 이분산성은 없어 보인다.
One Sample t-test
data: resid_female
t = -0.93497, df = 105, p-value = 0.3519
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-3.276746 1.176749
sample estimates:
mean of x
-1.049998
t-test 결과 예측오차의 평균은 0이라고 할 수 있다.
lmtest:: dwtest (lm (resid_female~ 1 ), alternative= "two.sided" )
Durbin-Watson test
data: lm(resid_female ~ 1)
DW = 1.7861, p-value = 0.2662
alternative hypothesis: true autocorrelation is not 0
(2)
z <- scan ("export.txt" )
plot.ts (z)
지난 과제에 언급한대로 이 시계열에는 이분산성은 없다고 할 수 있다.
추세와 계절성분이 있으므로 계절주기가 12, 가법형 계절평활법을 사용하는 것이 적합하다.
계절평활을 하기 위해서는 데이터를 ts 객체로 변환해야 한다
z_ts <- ts (z, frequency= 12 )
export_smoothing <- HoltWinters (z_ts)
export_smoothing
Holt-Winters exponential smoothing with trend and additive seasonal component.
Call:
HoltWinters(x = z_ts)
Smoothing parameters:
alpha: 0.3304767
beta : 0.04369053
gamma: 0.6102758
Coefficients:
[,1]
a 66.9300146
b 0.3670945
s1 -0.9590061
s2 -2.3460160
s3 -1.4388022
s4 4.0020957
s5 -2.8546787
s6 -3.1036803
s7 0.4486017
s8 3.3118493
s9 1.6302355
s10 8.0731659
s11 -11.5480012
s12 -8.8892298
plot (export_smoothing, lwd= 2 , lty= 1 : 2 )
legend ("topleft" , legend= c ("z" , "HoltWinters" ), col= 1 : 2 , lty= 1 : 2 , lwd= 2 )
-
예측오차분석
resid_export <- resid (export_smoothing)
plot.ts (resid_export)
abline (h= 0 , lty= 2 )
예측오차의 경우 0을 중심으로 대칭이고, 이분산성은 없어 보인다
One Sample t-test
data: resid_export
t = -0.99304, df = 73, p-value = 0.324
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-1.359825 0.455374
sample estimates:
mean of x
-0.4522256
t-test 결과 예측오차의 평균은 0이라고 할 수 있다.
lmtest:: dwtest (lm (resid_export~ 1 ), alternative= "two.sided" )
Durbin-Watson test
data: lm(resid_export ~ 1)
DW = 1.8163, p-value = 0.4267
alternative hypothesis: true autocorrelation is not 0
DW test 결과 예측오차들 간의 자기 상관은 없는 것으로 보인다.
따라서 예측오차는 분석 결과 평활 결과는 적합하다고 할 수 있다.
2장에서 계절추세 모형을 적합한 경우에는 예측오차 간에 자기 상관이 있다는 결과 를 얻었었는데, 평활을 이용한 결과 자기상관이 제거되었다.
-
계절추세모형
seasonal_I <- as.factor (cycle (z_ts))
t <- 1 : length (z)
m2 <- lm (z~ t+ seasonal_I)
m3 <- lm (z~ t+ I (t^ 2 )+ seasonal_I)
plot (export_smoothing, lwd= 2 , lty= 1 : 2 )
lines (ts (fitted (m2), frequency= 12 ), col= 'blue' , lty= 2 , lwd= 2 )
lines (ts (fitted (m3), frequency= 12 ), col= 'green' , lty= 2 , lwd= 2 )
legend ("topleft" , legend= c ("z" , "HoltWinters" , "seasonal trend (1)" , "seasonal trend (2)" ))
-
SSE 비교하기
head (export_smoothing$ fitted) ## 평활값은 12시차 이후값부터 생성됨
A Time Series: 6 × 4
Jan 2
23.77825
28.21682
0.8502812
-5.2888542
Feb 2
25.99728
30.78616
0.9253878
-5.7142708
Mar 2
34.53331
32.80963
0.9733636
0.7503125
Apr 2
35.55911
34.44285
1.0021933
0.1140625
May 2
39.71058
35.83200
1.0190994
2.8594792
Jun 2
41.81786
37.04258
1.0274655
3.7478125
sse_smoothing <- sum ((z[- (1 : 12 )]- export_smoothing$ fitted[,1 ])^ 2 ) #또는
sse_smoothing <- export_smoothing$ SSE
sse_m2 <- sum (resid (m2)^ 2 )
sse_m3 <- sum (resid (m3)^ 2 )
paste0 ("SSE_smomthing = " ,sse_smoothing)
paste0 ("SSE_m2 = " , sse_m2)
paste0 ("SSE_m3 = " , sse_m3)
'SSE_smomthing = 1135.42182593918'
'SSE_m2 = 1371.05731181319'
'SSE_m3 = 934.603221419272'
모형을 1시차 예측오차에 대한 제곱합으로 비교하면 2차추세모형을 적합한 m3의 SSE값이 가장 작고, 1차선형추세를 사용한 모형의 SSE가 가장 크다.
mse_smoothing <- mean ((z[- (1 : 12 )]- export_smoothing$ fitted[,1 ])^ 2 )
mse_m2 <- mean (resid (m2)^ 2 )
mse_m3 <- mean (resid (m3)^ 2 )
paste0 ("MSE_smomthing = " ,mse_smoothing)
paste0 ("MSE_m2 = " , mse_m2)
paste0 ("MSE_m3 = " , mse_m3)
'MSE_smomthing = 15.3435381883673'
'MSE_m2 = 15.9425268815487'
'MSE_m3 = 10.8674793188287'
3
(1)
dt <- read.csv ('data1.csv' )
head (dt)
A data.frame: 6 × 3
<int>
<int>
<dbl>
1
1
1
-1.5346871
2
2
2
2.6850469
3
3
3
-0.4288189
4
4
4
1.3724199
5
5
5
-0.9800884
6
6
6
2.4156505
추세가 있음, 계절성분은 없음
선형추세 모형 적합
m_trend <- lm (z~ t, dt)
summary (m_trend)
Call:
lm(formula = z ~ t, data = dt)
Residuals:
Min 1Q Median 3Q Max
-3.0803 -1.0287 0.0169 0.8426 4.3288
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.818932 0.296301 2.764 0.00682 **
t 0.099619 0.005094 19.557 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.47 on 98 degrees of freedom
Multiple R-squared: 0.796, Adjusted R-squared: 0.7939
F-statistic: 382.5 on 1 and 98 DF, p-value: < 2.2e-16
plot.ts (dt$ z)
abline (m_trend, col= 'red' )
legend ("topleft" , c ("z" , "trend" ), lty= 1 , col= 1 : 2 )
-
잔차분석
resid_m <- resid (m_trend)
plot.ts (resid_m)
abline (h= 0 , lty= 2 )
잔차의 경우 0을 중심으로 대칭이고, 이분산성은 없어 보인다.
One Sample t-test
data: resid_m
t = -5.2362e-16, df = 99, p-value = 1
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.2902834 0.2902834
sample estimates:
mean of x
-7.660376e-17
t-test 결과 예측오차의 평균은 0이라고 할 수 있다
Durbin-Watson test
data: m_trend
DW = 2.2164, p-value = 0.8389
alternative hypothesis: true autocorrelation is greater than 0
(2)
new_dt <- data.frame (t= 100 + (1 : 10 ))
pred_trend <- predict (m_trend, new_dt)
pred_trend
1 10.8804416292757 2 10.9800605357706 3 11.0796794422655 4 11.1792983487603 5 11.2789172552552 6 11.3785361617501 7 11.4781550682449 8 11.5777739747398 9 11.6773928812347 10 11.7770117877295
(3)
m_smoothing <- HoltWinters (dt$ z, gamma= FALSE )
m_smoothing
Holt-Winters exponential smoothing with trend and without seasonal component.
Call:
HoltWinters(x = dt$z, gamma = FALSE)
Smoothing parameters:
alpha: 0.496601
beta : 0.396225
gamma: FALSE
Coefficients:
[,1]
a 9.7266353
b -0.3150449
plot (m_smoothing, lwd= 2 )
legend ("topleft" , legend= c ("z" ,"smoothing" ), lty= 1 , lwd= 2 , col= 1 : 2 )
-
예측오차 분석
resid_smoothing <- dt$ z[- (1 : 2 )] - m_smoothing$ fitted[,1 ] #또는
resid_smoothing <- resid (m_smoothing) #같은 방법임
plot.ts (resid_smoothing)
abline (h= 0 , lty= 2 )
예측오차의 경우 0을 중심으로 대칭이고, 이분산성은 없어 보인다.
One Sample t-test
data: resid_smoothing
t = -1.0711, df = 97, p-value = 0.2868
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.6709125 0.2005740
sample estimates:
mean of x
-0.2351693
t-test 결과 예측오차의 평균은 0이라고 할 수 있다.
lmtest:: dwtest (lm (resid_smoothing~ 1 ), alternative= "two.sided" )
Durbin-Watson test
data: lm(resid_smoothing ~ 1)
DW = 1.9664, p-value = 0.8675
alternative hypothesis: true autocorrelation is not 0
(4)
pred_smoothing <- predict (m_smoothing, n.ahead= 10 , prediction.interval = T, level= 0.95 )
pred_smoothing
A Time Series: 10 × 3
101
9.411590
13.67142
5.1517644
102
9.096545
14.28017
3.9129175
103
8.781500
15.20395
2.3590541
104
8.466456
16.38382
0.5490889
105
8.151411
17.77356
-1.4707380
106
7.836366
19.34098
-3.6682458
107
7.521321
21.06388
-6.0212357
108
7.206276
22.92649
-8.5139377
109
6.891231
24.91716
-11.1346959
110
6.576186
27.02692
-13.8745530
forecast:: holt (dt$ z, alpha = m_smoothing$ alpha, beta= m_smoothing$ beta, h= 10 )#, initial)
Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
101 8.862685 6.0523463 11.67302 4.564643 13.16073
102 8.360702 4.5932352 12.12817 2.598859 14.12254
103 7.858719 2.6320999 13.08534 -0.134705 15.85214
104 7.356735 0.3034311 14.41004 -3.430363 18.14383
105 6.854752 -2.3086731 16.01818 -7.159497 20.86900
106 6.352769 -5.1561498 17.86169 -11.248603 23.95414
107 5.850786 -8.2094249 19.91100 -15.652451 27.35402
108 5.348803 -11.4485541 22.14616 -20.340538 31.03814
109 4.846819 -14.8590196 24.55266 -25.290661 34.98430
110 4.344836 -18.4296256 27.11930 -30.485697 39.17537
잘려서 뒤에가 뭐라고 써있는지를 모르겠음. initial값에 뭘 지정하는 것 같은데 똑같은 값이 안나온다
(5)
real_new_dt <- read.csv ("data1_new.csv" )
real_new_dt
A data.frame: 10 × 3
<int>
<int>
<dbl>
1
101
11.577471
2
102
13.171004
3
103
12.730258
4
104
12.242375
5
105
10.877077
6
106
13.297355
7
107
14.632224
8
108
15.049088
9
109
9.671734
10
110
12.216420
plot (dt$ t,dt$ z, xlim= c (1 ,110 ), ylim= c (- 2 , 15 ), type= 'l' )
lines (101 : 110 , pred_trend, col= 2 )
lines (101 : 110 , pred_smoothing, col= 3 )
ERROR: Error in xy.coords(x, y): 'x' and 'y' lengths differ
MSE, MAPE, MAE 값을 이용하여 비교할 수 있다.
\(MSE = \dfrac{1}{m} \sum_{i=1}^n \hat e_{n-1+t}(1)^2\)
\(MAPE = \dfrac{100}{n} \sum_{i=1}^n \left| \dfrac{\hat e_{n-1+t}(1)}{Z_{n+t}} \right|\)
\(MAE = \dfrac{1}{m} \sum_{i=1}^m \left| \hat e_{n-1+t}(1) \right|\)
e_trend <- real_new_dt$ z - pred_trend
e_smoothing <- real_new_dt$ z - pred_smoothing
(MSE_trend = mean (e_trend^ 2 ))
(MSE_smoothing = mean (e_smoothing^ 2 ))
(MAPE_trend = 100 * sum (abs (e_trend/ real_new_dt$ z)) / 10 )
(MAPE_smoothing = 100 * sum (abs (e_smoothing/ real_new_dt$ z)) / 10 )
(MAE_trend = mean (abs (e_trend)))
(MAE_smoothing = mean (abs (e_smoothing)))
3.91978903404576
127.173436899506
13.1385437579375
218.735568237967
1.69927387507187
9.02750167882282
교수님 풀이랑 smoothing 의 값이 좀 다르다.
4
z <- scan ('export.txt' )
plot.ts (z)
(1)
위에서 2차선형추세 모형이 더 적절했다고 했으므로, 2차 추세 모형을 적합한다.
z_ts <- ts (z, frequency= 12 )
seasonal_I <- as.factor (cycle (z_ts))
t <- 1 : length (z)
dec1_trend <- fitted (lm (z~ t+ I (t^ 2 ))) ## 추세성분
adjtrend = z- dec1_trend
dec1_seasonal <- fitted (lm (adjtrend ~ 0 + seasonal_I)) ## 계절성분
dec1_irr = z- dec1_trend- dec1_seasonal ## 불규칙 성분
par (mfrow= c (3 ,1 ))
plot.ts (dec1_trend)
plot.ts (dec1_seasonal)
plot.ts (dec1_irr)
abline (h= 0 , lty= 2 )
par9mfrow= c (1 ,1 )
(2)
plot.ts (dec1_irr)
abline (h= 0 , lty= 2 )
예측오차의 경우 0을 중심으로 대칭이고, 이분산성은 보이지 않는다.
One Sample t-test
data: dec1_irr
t = 2.2831e-16, df = 85, p-value = 1
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.7179805 0.7179805
sample estimates:
mean of x
8.244475e-17
t-test 결과 예측오차의 평균은 0이라고 할 수 있다.
lmtest:: dwtest (lm (dec1_irr~ 1 ), alternative= "two.sided" )
Durbin-Watson test
data: lm(dec1_irr ~ 1)
DW = 1.1429, p-value = 2.78e-05
alternative hypothesis: true autocorrelation is not 0
(3)
dec_fit <- decompose (z_ts, 'additive' )
plot (dec_fit)
(4)
dec2_irr <- dec_fit$ random
plot.ts (dec2_irr)
abline (h= 0 , lty= 2 )
예측오차의 경우 0을 중심으로 대칭이고, 이분산성은 없어 보인다.
One Sample t-test
data: dec2_irr
t = 0.074013, df = 73, p-value = 0.9412
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.5674456 0.6112171
sample estimates:
mean of x
0.02188575
t-test 결과 예측오차의 평균은 0이라고 할 수 있다
lmtest:: dwtest (lm (dec2_irr~ 1 ), alternative= "two.sided" )
Durbin-Watson test
data: lm(dec2_irr ~ 1)
DW = 1.9469, p-value = 0.8188
alternative hypothesis: true autocorrelation is not 0
DW test 결과 예측오차들 간의 자기 상관은 없는 것으로 보인다.
따라서 예측오차는 분석 결과 평활 결과는 적절하다고 할 수 있다.
추세를 이용한 분해법에서 예측 오차는 상관관계가 있었지만, 평활법을 사용하면서 예측오차들의 상관관계를 제거할 수 있었다.
(5)
sse_1 = sum (dec1_irr^ 2 )
sse_2 = sum (dec2_irr^ 2 , na.rm= T)
paste0 ("SSE_1 = " , sse_1)
paste0 ("SSE_2 = " , sse_2)
'SSE_1 = 953.219486362055'
'SSE_2 = 472.381499188028'
SSE 값을 비교하였을 때, 평활에 의한 분해법의 값이 더 작다.
mse_1 = mean (dec1_irr^ 2 )
mse_2 = mean (dec2_irr^ 2 , na.rm= T)
paste0 ("MSE_1 = " , mse_1)
paste0 ("MSE_2 = " , mse_2)
'MSE_1 = 11.0839475158378'
'MSE_2 = 6.38353377281119'
5
z <- scan ('usapass.txt' )
plot.ts (z)
(1)
log_z <- log (z)
plot.ts (log_z)
(2)
지수함수를 사용한 계절형 추세모형을 적합한다.
z_ts <- ts (z, frequency= 12 )
log_z_ts = log (z_ts)
seasonal_I <- as.factor (cycle (log_z_ts))
t <- 1 : length (z)
m_trend <- lm (log_z_ts~ 0 + t+ seasonal_I)
summary (m_trend)
Call:
lm(formula = log_z_ts ~ 0 + t + seasonal_I)
Residuals:
Min 1Q Median 3Q Max
-0.159814 -0.044426 0.000623 0.045572 0.151846
Coefficients:
Estimate Std. Error t value Pr(>|t|)
t 0.0100999 0.0001252 80.67 <2e-16 ***
seasonal_I1 4.7246982 0.0198289 238.27 <2e-16 ***
seasonal_I2 4.7026123 0.0198822 236.52 <2e-16 ***
seasonal_I3 4.8342011 0.0199361 242.49 <2e-16 ***
seasonal_I4 4.8015084 0.0199907 240.19 <2e-16 ***
seasonal_I5 4.8009618 0.0200459 239.50 <2e-16 ***
seasonal_I6 4.9237482 0.0201017 244.94 <2e-16 ***
seasonal_I7 5.0296649 0.0201582 249.51 <2e-16 ***
seasonal_I8 5.0223242 0.0202153 248.44 <2e-16 ***
seasonal_I9 4.8708171 0.0202729 240.26 <2e-16 ***
seasonal_I10 4.7357833 0.0203312 232.93 <2e-16 ***
seasonal_I11 4.5905564 0.0203901 225.14 <2e-16 ***
seasonal_I12 4.7032829 0.0204496 229.99 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.06224 on 131 degrees of freedom
Multiple R-squared: 0.9999, Adjusted R-squared: 0.9999
F-statistic: 8.844e+04 on 13 and 131 DF, p-value: < 2.2e-16
\(\hat Z_t = 0.01t + 4.72I_1 + 4.70I_2 + \dots + 4.70I_{12}\)
ts.plot (log_z_ts, ts (fitted (m_trend), frequency= 12 ), col= 1 : 2 , lty= 1 : 2 , lwd= 2 )
legend ("topleft" , c ("log_z" , "trend_log" ), col= 1 : 2 , lty= 1 : 2 , lwd= 2 )
ts.plot (z_ts, ts (exp (fitted (m_trend)), frequency= 12 ), col= 1 : 2 , lty= 1 : 2 , lwd= 2 )
legend ("topleft" , c ("z" , "trend" ), col= 1 : 2 , lty= 1 : 2 , lwd= 2 )
-
잔차분석
resid_trend <- resid (m_trend)
plot.ts (resid_m)
abline (h= 0 , lty= 2 )
잔차의 경우 0을 중심으로 대칭이고, 이분산성은 없어 보인다
One Sample t-test
data: resid_m
t = -5.2362e-16, df = 99, p-value = 1
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.2902834 0.2902834
sample estimates:
mean of x
-7.660376e-17
t-test 결과 예측오차의 평균은 0이라고 할 수 있다.
lmtest:: dwtest (m_trend, alternative= "two.sided" )
Durbin-Watson test
data: m_trend
DW = 0.40831, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is not 0
(3)
-
로그변환한 데이터에 대한 가법 모형
m_smoothing <- HoltWinters (log_z_ts)
m_smoothing
Holt-Winters exponential smoothing with trend and additive seasonal component.
Call:
HoltWinters(x = log_z_ts)
Smoothing parameters:
alpha: 0.3447498
beta : 0.003585913
gamma: 0.879488
Coefficients:
[,1]
a 6.165298459
b 0.008744433
s1 -0.073696849
s2 -0.142822821
s3 -0.039964334
s4 0.015968620
s5 0.033673237
s6 0.157016140
s7 0.300626468
s8 0.285698068
s9 0.098491289
s10 -0.021898771
s11 -0.190036243
s12 -0.096734648
plot (m_smoothing, lwd= 2 , lty= 1 : 2 )
legend ("topleft" , legend= c ("log_z" , "HoltWinters" ), col= 1 : 2 , lty= 1 : 2 , lwd= 2 )
-
잔차분석
resid_smooting <- resid (m_smoothing)
plot.ts (resid_smooting)
abline (h= 0 , lty= 2 )
예측오차의 경우 0을 중심으로 대칭이고, 이분산성은 없어 보인다.
One Sample t-test
data: resid_smooting
t = 1.2026, df = 131, p-value = 0.2313
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.002766709 0.011346227
sample estimates:
mean of x
0.004289759
t-test 결과 예측오차의 평균은 0이라고 할 수 있다.
lmtest:: dwtest (lm (resid_smooting~ 1 ), alternative= "two.sided" )
Durbin-Watson test
data: lm(resid_smooting ~ 1)
DW = 1.4549, p-value = 0.001604
alternative hypothesis: true autocorrelation is not 0
DW test 결과 예측오차들 간의 자기 상관이 있는 것으로 보인다.
하지만, 추세모형을 적합하였을 때 얻어진 잔차에 비해 유의확률값이 크다.
예측오차는 분석 결과 추세모형 적합 결과보다는 평활 결과가 더 적절하다고 할 수 있다.
-
원 데이터에 대한 승법모형 적용
m_smoothing_multi <- HoltWinters (z_ts, seasonal = "multiplicative" )
m_smoothing_multi
Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
Call:
HoltWinters(x = z_ts, seasonal = "multiplicative")
Smoothing parameters:
alpha: 0.3204565
beta : 0.02388265
gamma: 1
Coefficients:
[,1]
a 464.9721064
b 2.7859138
s1 0.9464640
s2 0.8810274
s3 0.9648716
s4 1.0334898
s5 1.0470250
s6 1.1793118
s7 1.3631491
s8 1.3399425
s9 1.1195987
s10 0.9993794
s11 0.8438225
s12 0.9290880
plot (m_smoothing_multi, lwd= 2 , lty= 1 : 2 )
legend ("topleft" , legend= c ("z" , "HoltWinters (multiplicative)" ), col= 1 : 2 , lty= 1 : 2 )
plot (m_smoothing_multi, lwd= 1 : 2 , lty= 1 : 2 )
lines (exp (m_smoothing$ fitted[,1 ]), col= 4 , lty= 2 , lwd= 2 )
legend ("topleft" , legend= c ("z" , "HoltWinters (multiplicative)" , "exp(HoltWinters)" ))
-
승법모형에 대한 잔차분석
resid_smooting_multi <- resid (m_smoothing_multi)
plot.ts (resid_smooting_multi)
abline (h= 0 , lty= 2 )
예측오차의 경우 0을 중심으로 대칭이고, 이분산성은 없어 보인다.
t.test (resid_smooting_multi)
One Sample t-test
data: resid_smooting_multi
t = 1.5746, df = 131, p-value = 0.1178
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.4315512 3.7983414
sample estimates:
mean of x
1.683395
t-test 결과 예측오차의 평균은 0이라고 할 수 있다.
DW test 결과 예측오차들 간의 자기 상관이 있는 것으로 보인다.
하지만, 추세모형을 적합하였을 때 얻어진 잔차에 비해 유의확률값이 크지만, 가법 모형을 사용한 평활법에 비하면 조금 크다.
차이가 크지 않지만, 가법 모형이 더 적절하다고 할 수 있다. 따라서 가법 모형 사용.
(4)
로그변환한 데이터에 대한 가법모형을 사용하거나, 원래 데이터에 대한 승법 모형 적합 가능
decompose 함수 사용
m_decompose_add <- decompose (log_z_ts, 'additive' )
plot (m_decompose_add)
m_decompose_multi <- decompose (z_ts, 'multiplicative' )
plot (m_decompose_multi)
fitted_dec_add <- m_decompose_add$ trend + m_decompose_add$ seasonal #가법모형은 더
fitted_dec_multi <- m_decompose_multi$ trend * m_decompose_multi$ seasonal #승법모
ts.plot (z_ts, exp (fitted_dec_add), fitted_dec_multi, col= c (1 ,2 ,4 ), lwd= 2 , lty= 1 : 2 )
legend ("topleft" , c ("z" ,"decompose_add" , "decompose_multi" ), col= c (1 ,2 ,4 ), lty= 1 : 2 )
가법모형과 승법 모형은 차이가 거의 없어 보임
-
잔차분석을 하라는 문제는 없었지만 한 번 해보겠음.
resid_decompose_add <- m_decompose_add$ random
resid_decompose_multi <- m_decompose_multi$ random
par (mfrow= c (1 ,2 ))
plot.ts (resid_decompose_add, main= "잔차그림 : 분해법(가법모형)" )
abline (h= 0 , lty= 2 )
plot.ts (resid_decompose_multi, main= "잔차그림 : 분해법(승법모형)" )
abline (h= 1 , lty= 2 )
t.test (resid_decompose_add)
t.test (resid_decompose_multi, mu= 1 )
One Sample t-test
data: resid_decompose_add
t = -0.28335, df = 131, p-value = 0.7774
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.006909609 0.005178249
sample estimates:
mean of x
-0.00086568
One Sample t-test
data: resid_decompose_multi
t = -0.59098, df = 131, p-value = 0.5556
alternative hypothesis: true mean is not equal to 1
95 percent confidence interval:
0.992186 1.004219
sample estimates:
mean of x
0.9982026
t-test 결과 가법모형에서 예측오차의 평균은 0이라고 할 수 있고, 승법모형에서 예 측오차의 평균은 1이라고 할 수 있다
lmtest:: dwtest (lm (resid_decompose_add~ 1 ), alternative= "two.sided" )
lmtest:: dwtest (lm (resid_decompose_multi~ 1 ), alternative= "two.sided" )
Durbin-Watson test
data: lm(resid_decompose_add ~ 1)
DW = 1.1441, p-value = 7.258e-07
alternative hypothesis: true autocorrelation is not 0
Durbin-Watson test
data: lm(resid_decompose_multi ~ 1)
DW = 1.1426, p-value = 6.946e-07
alternative hypothesis: true autocorrelation is not 0
DW test 결과 가법,승법 모두 예측오차들 간의 자기 상관이 있는 것으로 보인다.
(5)
주의 : 예측오차의 제곱합을 구하기 위해서는 로그변환한 자료를 사용한 분석 방법 의 경우 지수함수를 이용한 역변환을 한 후 계산해야 한다.
e_trend <- z- exp (fitted (m_trend)) #추세모형을 적합한 경우의 예측오차
e_smoothing_add <- z[- (1 : 12 )]- exp (m_smoothing$ fitted[,1 ]) #평활(가법)을 적합한 경
e_smoothing_multi <- z[- (1 : 12 )]- m_smoothing_multi$ fitted[,1 ] #평활(가법)을 적합한
e_decompose_add <- z - exp (fitted_dec_add) #분해법(가법)을 적합한 경우의 예측오차
e_decompose_multi <- z - fitted_dec_multi #분해법(승법)을 적합한 경우의 예측오차
#SSE
sse1 <- sum (e_trend^ 2 , na.rm= T)
sse2 <- sum (e_smoothing_add^ 2 , na.rm= T)
sse3 <- sum (e_smoothing_multi^ 2 , na.rm= T)
sse4 <- sum (e_decompose_add^ 2 , na.rm= T)
sse5 <- sum (e_decompose_multi^ 2 , na.rm= T)
paste0 ("추세분석에서의 SSE = " , sse1)
paste0 ("가법 계절평활법에 의한 SSE = " , sse2)
paste0 ("승법 계절평활법에 의한 SSE = " , sse3)
paste0 ("가법 분해법에 의한 SSE = " , sse4)
paste0 ("승법 분해법에 의한 SSE = " , sse5)
'추세분석에서의 SSE = 49268.5277996137'
'가법 계절평활법에 의한 SSE = 20103.3932111226'
'승법 계절평활법에 의한 SSE = 20138.5987482274'
'가법 분해법에 의한 SSE = 15284.0239261845'
'승법 분해법에 의한 SSE = 14748.922939659'
#MSE
mse1 <- mean (e_trend^ 2 , na.rm= T)
mse2 <- mean (e_smoothing_add^ 2 , na.rm= T)
mse3 <- mean (e_smoothing_multi^ 2 , na.rm= T)
mse4 <- mean (e_decompose_add^ 2 , na.rm= T)
mse5 <- mean (e_decompose_multi^ 2 , na.rm= T)
paste0 ("추세분석에서의 MSE = " , mse1)
paste0 ("가법 계절평활법에 의한 MSE = " , mse2)
paste0 ("승법 계절평활법에 의한 MSE = " , mse3)
paste0 ("가법 분해법에 의한 MSE = " , mse4)
paste0 ("승법 분해법에 의한 MSE = " , mse5)
'추세분석에서의 MSE = 342.142554163984'
'가법 계절평활법에 의한 MSE = 152.298433417596'
'승법 계절평활법에 의한 MSE = 152.565142032026'
'가법 분해법에 의한 MSE = 115.788060046852'
'승법 분해법에 의한 MSE = 111.734264694387'
MSE 역시 승법 분해법을 이용했을 때 가장 작은 값을 갖는다